
#import "Resource.h"
#import "ResourceManager.h"

static ResourceManager *resManagerInstance = nil;

@implementation ResourceManager

@synthesize resourcesTable;

+(ResourceManager*) instance
{
	if(resManagerInstance==nil)
	{
		resManagerInstance = [[ResourceManager alloc] init];
	}
	
	return resManagerInstance;
}

-(id) init
{
	[super init];
	resourcesTable = [[NSMutableDictionary alloc] initWithCapacity:100];

	return self;
}

-(void)dealloc
{
	[resourcesTable removeAllObjects];
	[resourcesTable release];
	
	[super dealloc];
}

-(Resource*)findResource:(NSString*) resName
{
	return [resourcesTable objectForKey:resName];
}

-(Resource*)loadResource:(Class)resClass name:(NSString*)resName
{
	Resource *res = [self findResource:resName];
	
//	assert([resClass isSubClassOf:[Resource class]]);
	
	if(res)
	{
		int rc = [res retainCount];
		
		assert([res isKindOfClass:resClass]);

		res.refCount = res.refCount + 1;
		
		// Делаем вид что мы только что создали этот ресурс
		// так как тот что его загружает думает именно так и вызовет release.
		[res retain];
		
		return res;
	}
	else
	{
		Resource *newRes = [[resClass alloc] initWithName:resName];
		
		newRes.refCount = 1;
		[resourcesTable setObject:newRes forKey:resName];
		
		//[newRes release];
		
		return newRes;
	}
}

-(void)unloadResourceByName:(NSString*)resName
{
	Resource *res = [self findResource:resName];
	
	if(res)
	{
		int rc = [res retainCount];
		
		if(res.refCount<=1)
		{
			int rc = [res retainCount];
			
			[resourcesTable removeObjectForKey:resName];
		}
		else
			res.refCount = res.refCount - 1;
	}
}

-(void)unloadResource:(Resource*)res
{
	[self unloadResourceByName:res.name];
}

@end
